package com.wangjie;

/**
 * 懒汉式
 * 虽然达到了按需初始化的目的，却带来高并发不安全的问题
 * 加锁 加双重判断
 * 第一层判断可以过滤掉 进入判断时 已经有了实例对象的 线程
 * 第二层判断 最初始的时候 有一个线程 拿到锁 初始化一个实例 后面的线程 拿到锁 之后 判断一下 有实例 不再初始化
 */
public class Mgr05 {

    private static Mgr05 instance;

    private Mgr05() {
    }

    public static Mgr05 getInstance() {
        if (instance == null) {
            synchronized (Mgr05.class){
                if(instance == null){
                    try {
                        Thread.sleep(2000);
                        instance = new Mgr05();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return instance;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Mgr05.getInstance().hashCode());
                }
            }).start();
        }
    }


}
